/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.util.StringUtils;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKCotizacion;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetalleCotizacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioArchivos;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioCotizacion;
import pe.com.cotelasa.scp.dominio.service.IServicioDetalleCotizacion;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.Cotizacion;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.DetalleCotizacion;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@SuppressWarnings("serial")
@Named(value = "MBCotizacion")
@Scope("request")
public class MBCotizacion extends MBGenerico implements IMantenedor, Serializable {

    private static Logger logger = Logger.getLogger(MBCotizacion.class);
    @Inject
    private BKCotizacion bkCotizacion;
    @Inject
    private BKDetalleCotizacion bkDetalleCotizacion;
    @Inject
    private IServicioCotizacion servicioCotizacion;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Inject
    private IServicioTipoUnidadMinima servicioTipoUnidadMinima;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioCliente servicioCliente;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioSede servicioSede;
    @Inject
    private IServicioDetalleCotizacion servicioDetalleCotizacion;
    private String URL;
    @Autowired
    BKSession session;

    public void marcarInicio(DateSelectEvent event) {
        bkCotizacion.setFechaInicio(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkCotizacion.setFechaFinal(event.getDate());
    }

    public void buscarListaCotizaciones() {
        try {
            Cotizacion cotiza = bkCotizacion.getCotizacionBusqueda();
            cotiza.setVersion(0);
            cotiza.setIdEmpresa(session.getEmpresa());
            bkCotizacion.setListaCotizacionesActivos(this.servicioCotizacion.buscarCotizacionesPorFiltro(cotiza, bkCotizacion.getFechaInicio(), bkCotizacion.getFechaFinal()));

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrarMantenimiento() {
        bkCotizacion.setCategoriaArticulo(null);
        bkCotizacion.setCotizacionBusqueda(new Cotizacion());
        bkCotizacion.getCotizacionBusqueda().setCodigo("");
        bkCotizacion.getCotizacionBusqueda().setCliente("");
        bkCotizacion.getCotizacionBusqueda().setNombreProducto("");
        bkCotizacion.getCotizacionBusqueda().setTipoCot('%');
        //try {
        //bkCotizacion.setListaCategoriaArticulos(servicioCategoriaArticulo.listarCategoriasTP());
        bkCotizacion.setListaCotizacionesActivos(null);
        bkCotizacion.setListaArticulosFormulario(null);
        //bkCotizacion.setListaClienteFormulario(servicioCliente.listarClientesActivos());
        /*} catch (ServiceException e) {
         e.printStackTrace();
         }*/
        return URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;

    }

    @Override
    public String nuevo() {
        this.bkCotizacion.setComando(new ComandoGuardar(this));
        bkDetalleCotizacion.inicializarValores();
        bkCotizacion.setCotizacionFormulario(new Cotizacion());
        bkCotizacion.getCotizacionFormulario().setSubTotal(BigDecimal.ZERO);
        bkCotizacion.getCotizacionFormulario().setIdArticulo(new Articulo(0));
        bkCotizacion.setCategoriaArticulo(null);
        bkCotizacion.setTotalArticuloYServicio(BigDecimal.ZERO);
        bkCotizacion.setEsNuevaVersion(false);
        bkCotizacion.setImagen(null);
        inicializarValores();
        if (bkCotizacion.getCotizacionFormulario().getCambioCompra() == null) {
            mostrarError("No se ha registrado el tipo de cambio de hoy");
            return URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;
        } else {
            return URLPaginacion.Cotizacion.URL_FORMULARIO_COTIZACION;
        }

    }

    @Override
    public String guardar() {
        try {
            String ext = "";
            if (!bkCotizacion.isEsNuevaVersion()) {
                generarCodigo();
                bkCotizacion.getCotizacionFormulario().setVersion(1);
                if (bkCotizacion.getImagen() != null) {
                    String[] imagen = StringUtils.split(bkCotizacion.getImagen().getFileName(), ".");

                    ext = imagen[imagen.length - 1];
                    System.out.println("la extension es: " + ext);
                    bkCotizacion.getCotizacionFormulario().setImagen(bkCotizacion.getCotizacionFormulario().getCodigo() + "." + ext);
                }

            } else {
                bkCotizacion.getCotizacionFormulario().setVersion(bkCotizacion.getVersion());
            }



            Cotizacion cotiza = bkCotizacion.getCotizacionFormulario();
            cotiza.setUsrCreacion(session.getUsuario().getUsuario());
            cotiza.setCliente(cotiza.getIdCliente().getRazonSocial());
            cotiza.setIdEmpresa(session.getEmpresa());

            cotiza.setFecCreacion(new Date());
            cotiza.setId(null);
            for (DetalleCotizacion det1 : bkDetalleCotizacion.getListaDetalleCotizacionArticulo()) {
                det1.setId(null);
                det1.setIdCotizacion(cotiza);
            }

            for (DetalleCotizacion det2 : bkDetalleCotizacion.getListaDetalleCotizacionServicio()) {
                det2.setIdCotizacion(cotiza);
                det2.setId(null);

                bkDetalleCotizacion.getListaDetalleCotizacionArticulo().add(det2);

            }
            cotiza.setDetalleCotizacionCollection(new ArrayList<DetalleCotizacion>());

            cotiza.getDetalleCotizacionCollection().addAll(bkDetalleCotizacion.getListaDetalleCotizacionArticulo());

            servicioCotizacion.guardarCotizacion(cotiza);

            if (bkCotizacion.getImagen() != null) {
                guardarLogoServer(bkCotizacion.getImagen(), serviceProperties.getProperty("path.server.imagen.cotizacion")
                        + bkCotizacion.getCotizacionFormulario().getImagen());
            }

            mostrarMensaje("Se guardo la Cotización satisfactoriamente.");
            //URL = mostrarMantenimiento();
            buscarListaCotizaciones();
            URL = URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
            mostrarError("Ocurrio un error al cargar la informacion.");
            URL = URLPaginacion.Cotizacion.URL_FORMULARIO_COTIZACION;
        }


        return URL;
    }

    @Override
    public String editar() {

        this.bkCotizacion.setComando(new ComandoActualizar(this));
        bkCotizacion.setTotalArticuloYServicio(BigDecimal.ZERO);

        /*try{
         bkCotizacion.setCotizacionFormulario(servicioCotizacion.conseguirCotizacionPorId(bkCotizacion.getCotizacionFormulario().getId()));
         } catch (ServiceException e) {
         e.printStackTrace();
         logger.error(e.getMessage(), e);
         mostrarError("Ocurrio un error al cargar la informacion.");
         }*/
        inicializarValores();
        iniciarEdicion();

        return URLPaginacion.Cotizacion.URL_FORMULARIO_COTIZACION;

    }

    public void iniciarEdicion() {
        bkDetalleCotizacion.inicializarValores();

        try {
            DetalleCotizacion detalle = new DetalleCotizacion();
            detalle.setIdCotizacion(bkCotizacion.getCotizacionFormulario());
            detalle.setTipoDetalle('A');

            bkDetalleCotizacion.setListaDetalleCotizacionArticulo((List) servicioDetalleCotizacion.listarDetalleCotizacionesPorTipo(detalle));
            if (bkDetalleCotizacion.getListaDetalleCotizacionArticulo() != null || bkDetalleCotizacion.getListaDetalleCotizacionArticulo().size() > 0) {
                for (DetalleCotizacion det1 : bkDetalleCotizacion.getListaDetalleCotizacionArticulo()) {
                    bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().add(det1);
                    bkDetalleCotizacion.setSumaDetalleArticulo(bkDetalleCotizacion.getSumaDetalleArticulo().add(det1.getPrecio()));
                    bkCotizacion.setTotalArticuloYServicio(bkCotizacion.getTotalArticuloYServicio().add(det1.getPrecio()));
                }
            }
            detalle.setTipoDetalle('S');
            bkDetalleCotizacion.setListaDetalleCotizacionServicio((List) servicioDetalleCotizacion.listarDetalleCotizacionesPorTipo(detalle));
            if (bkDetalleCotizacion.getListaDetalleCotizacionServicio() != null || bkDetalleCotizacion.getListaDetalleCotizacionServicio().size() > 0) {
                for (DetalleCotizacion det2 : bkDetalleCotizacion.getListaDetalleCotizacionServicio()) {
                    bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar().add(det2);
                    bkDetalleCotizacion.setSumaDetalleServicio(bkDetalleCotizacion.getSumaDetalleServicio().add(det2.getPrecio()));
                    bkCotizacion.setTotalArticuloYServicio(bkCotizacion.getTotalArticuloYServicio().add(det2.getPrecio()));
                }
            }
        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    @Override
    public String actualizar() {
        try {
            Cotizacion cotiza = bkCotizacion.getCotizacionFormulario();
            cotiza.setUsrModificacion(session.getUsuario().getUsuario());
            cotiza.setFecModificacion(new Date());
            for (DetalleCotizacion det1 : bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar()) {
                if (det1.getIdCotizacion() == null) {
                    det1.setIdCotizacion(cotiza);
                }
            }

            for (DetalleCotizacion det2 : bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar()) {
                if (det2.getIdCotizacion() == null) {
                    det2.setIdCotizacion(cotiza);
                }
                bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().add(det2);
            }
            cotiza.setDetalleCotizacionCollection(bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar());


            servicioCotizacion.actualizarCotizacion(cotiza);

            mostrarMensaje("Se actualizo la Cotización satisfactoriamente.");

            //URL = mostrarMantenimiento();
            buscarListaCotizaciones();
            URL = URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;

        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
            URL = URLPaginacion.Cotizacion.URL_FORMULARIO_COTIZACION;
        }


        return URL;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        Cotizacion cotizacion = bkCotizacion.getCotizacionSeleccionado();
        cotizacion.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        cotizacion.setUsrModificacion(session.getUsuario().getUsuario());
        cotizacion.setFecModificacion(new Date());
        try {
            servicioCotizacion.actualizarCotizacion(cotizacion);
            buscarListaCotizaciones();
            mostrarMensaje("Se elimino la Cotización satisfactoriamente");
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    @Override
    public String ver() {
        editar();
        return URLPaginacion.Cotizacion.URL_VER_COTIZACION;
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void inicializarValores() {

        try {
            TipoCambio tipoCambio = new TipoCambio();
            tipoCambio.setFecCreacion(new Date());
            bkCotizacion.setTipoCambio(servicioTipoCambio.ValidarTipoCambio(tipoCambio));
            bkCotizacion.setListaCategoriaArticulos(servicioCategoriaArticulo.listarCategoriasTP());
            bkCotizacion.setListaUnidadMedidaFormulario(servicioTipoUnidadMinima.listarTipoUnidadMinimasActivos());
            bkCotizacion.setListaClienteFormulario(servicioCliente.listarClientesActivos());
            bkCotizacion.setListaDetalleCotizacionesVersion(new ArrayList<DetalleCotizacion>());
            bkCotizacion.setListaArticulosFormulario(null);
            if (bkCotizacion.getComando().getNombre().equals("Guardar") && bkCotizacion.getTipoCambio() != null) {

                bkCotizacion.getCotizacionFormulario().setCambioCompra(bkCotizacion.getTipoCambio().getCompra());
                bkCotizacion.getCotizacionFormulario().setCambioVenta(bkCotizacion.getTipoCambio().getVenta());
            }
        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void cargarComposicion() {


        if (bkCotizacion.getComando().getNombre().equals("Actualizar")) {
            bkDetalleCotizacion.setListaDetalleCotizacionArticulo(new ArrayList<DetalleCotizacion>());
            Iterator itr = this.bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().iterator();
            while (itr.hasNext()) {
                DetalleCotizacion det2 = (DetalleCotizacion) itr.next();
                if (det2.getId() == null) {
                    itr.remove();
                } else {
                    det2.setFecModificacion(new Date());
                    det2.setUsrModificacion(session.getUsuario().getUsuario());
                    det2.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                }
            }

        } else {
            bkDetalleCotizacion.setListaDetalleCotizacionArticulo(new ArrayList<DetalleCotizacion>());
            bkDetalleCotizacion.setListaDetalleCotizacionArticuloEditar(new ArrayList<DetalleCotizacion>());
        }

        try {
            bkCotizacion.getCotizacionFormulario().setIdArticulo(servicioArticulo.conseguirArticuloPorId(bkCotizacion.getCotizacionFormulario().getIdArticulo().getId()));
            
            ComposicionArticulo composicion = new ComposicionArticulo();
            composicion.setIdArticulo(bkCotizacion.getCotizacionFormulario().getIdArticulo());
            bkCotizacion.getCotizacionFormulario().setNombreProducto(bkCotizacion.getCotizacionFormulario().getIdArticulo().getModelo());

            Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);
            if (bkCotizacion.getCotizacionFormulario().getTipoCot() == 'T') {
                bkCotizacion.getCotizacionFormulario().setDatosTela(bkCotizacion.getCotizacionFormulario().getIdArticulo().getDatosTecnicos());
            }
            Iterator itr = listaComposicion.iterator();
            while (itr.hasNext()) {
                ComposicionArticulo comp = (ComposicionArticulo) itr.next();
                DetalleCotizacion detalle = new DetalleCotizacion();
                detalle.setNombreDetalle(comp.getIdArticuloComp().getNombreComercial());
                detalle.setTipoDetalle('A');
                detalle.setUnidadMedida(comp.getTipo());
                detalle.setComposicion(comp.getCantidad());
                detalle.setFecCreacion(new Date());
                detalle.setUsrCreacion(session.getUsuario().getUsuario());
                detalle.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                bkDetalleCotizacion.getListaDetalleCotizacionArticulo().add(detalle);
                bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().add(detalle);

                if (comp.getIdArticuloComp().getIdCategoriaArticulo().getIdCategoriaArticulo().getNombre().equals("TELA")
                        && bkCotizacion.getCotizacionFormulario().getTipoCot() == 'P') {
                    bkCotizacion.getCotizacionFormulario().setDatosTela(comp.getIdArticuloComp().getDatosTecnicos());
                }
                if (bkCotizacion.getCotizacionFormulario().getTipoCot() == 'T') {
                    ComposicionArticulo composicion1 = new ComposicionArticulo();

                    composicion1.setIdArticulo(comp.getIdArticuloComp());

                    Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);
                    itr.remove();
                    if (listaComposicionAdd.size() > 0) {
                        listaComposicion.addAll(listaComposicionAdd);
                    }
                    itr = listaComposicion.iterator();

                }
            }
            if (!this.bkCotizacion.getListaDetalleCotizacionesVersion().isEmpty()) {
                for (DetalleCotizacion detalle1 : bkDetalleCotizacion.getListaDetalleCotizacionArticulo()) {

                    for (DetalleCotizacion detalle2 : bkCotizacion.getListaDetalleCotizacionesVersion()) {
                        if (detalle1.getNombreDetalle().equalsIgnoreCase(detalle2.getNombreDetalle())) {
                            detalle1.setCostoSoles(detalle2.getCostoSoles());
                            detalle1.setCosto(detalle2.getCosto());

                            detalle1.setCantidadCompra(detalle2.getCantidadCompra());
                            detalle1.setUnidadMedidaCompra(detalle2.getUnidadMedidaCompra());

                            detalle1.setPrecio((detalle1.getComposicion().divide(detalle1.getCantidadCompra(), MathContext.DECIMAL32)).multiply(detalle1.getCosto(), MathContext.DECIMAL32));
                            break;
                        }
                    }
                }
            }

            bkDetalleCotizacion.setSumaDetalleArticulo(MBDetalleCotizacion.sumarPrecio(bkDetalleCotizacion.getListaDetalleCotizacionArticulo()));
            calcularTotales();

        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
    
    public void buscarArticulo() {
        try {

            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkCotizacion.getCategoriaArticulo());
            this.bkCotizacion.setListaArticulosFormulario(servicioArticulo.listarArticulosPorCategoria(articulo));
            if (this.bkCotizacion.getCategoriaArticulo().getNombre().equals("TELA") || this.bkCotizacion.getCategoriaArticulo().getIdCategoriaArticulo().getNombre().equals("TELA")) {
                this.bkCotizacion.getCotizacionFormulario().setTipoCot('T');
            } else {
                this.bkCotizacion.getCotizacionFormulario().setTipoCot('P');
            }
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }
    
    

    public void calcularTotales() {
        bkCotizacion.setTotalArticuloYServicio(
                bkDetalleCotizacion.getSumaDetalleServicio().add(bkDetalleCotizacion.getSumaDetalleArticulo()));
        BigDecimal subtotal = BigDecimal.ZERO;
        Cotizacion cotiza = bkCotizacion.getCotizacionFormulario();
        subtotal = subtotal.add(bkCotizacion.getTotalArticuloYServicio());
        if (cotiza.getPorcentajeMerma() != null) {
            bkCotizacion.getCotizacionFormulario().setMerma(
                    bkCotizacion.getTotalArticuloYServicio().multiply(cotiza.getPorcentajeMerma().divide(BigDecimal.valueOf(100.00))));
            subtotal = subtotal.add(bkCotizacion.getCotizacionFormulario().getMerma());
        }
        if (cotiza.getGastosAdministrativos() != null) {
            subtotal = subtotal.add(cotiza.getGastosAdministrativos());
        }
        if (cotiza.getGastosAduaneros() != null) {
            subtotal = subtotal.add(cotiza.getGastosAduaneros());
        }

        bkCotizacion.getCotizacionFormulario().setSubTotal(subtotal);

        if (cotiza.getProcentajeUtilidad() != null) {
            bkCotizacion.getCotizacionFormulario().setUtilidad(
                    bkCotizacion.getCotizacionFormulario().getSubTotal().multiply(cotiza.getProcentajeUtilidad().divide(BigDecimal.valueOf(100.00))));
            subtotal = subtotal.add(bkCotizacion.getCotizacionFormulario().getUtilidad());
        }

        bkCotizacion.getCotizacionFormulario().setPrecioVenta(subtotal);

    }

    public void generarCodigo() {

        CorrelativoDocumento correlativo = new CorrelativoDocumento();
        correlativo.setAnio(UtilitarioFecha.obtenerAnioActual());

        TipoDocumento tipoDocumento = new TipoDocumento();
        tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_COTIZACION);

        String format = "%1$05d";

        Integer numero = 0;
        try {
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            //correlativo.setIdsede(servicioSede.conseguirSedePorId(1));
            correlativo.setIdsede(session.getSede());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoDocumentoPorAnio(correlativo);
            if (correlativoEncontrado == null) {

                correlativo.setUsrCreacion(session.getUsuario().getUsuario());
                correlativo.setFecCreacion(new Date());
                correlativo.setNumero("00002");

                servicioCorrelativo.guardarCorrelativoDocumento(correlativo);
                bkCotizacion.getCotizacionFormulario().setCodigo("COT" + bkCotizacion.getCotizacionFormulario().getTipoCot() + "-" + correlativo.getAnio() + "-00001");

            } else {

                correlativo = correlativoEncontrado;
                numero = Integer.parseInt(correlativo.getNumero());
                bkCotizacion.getCotizacionFormulario().setCodigo("COT" + bkCotizacion.getCotizacionFormulario().getTipoCot() + "-" + correlativo.getAnio() + "-" + String.format(format, numero));
                numero++;
                correlativo.setNumero(String.format(format, numero));
                correlativo.setUsrModificacion(session.getUsuario().getUsuario());
                correlativo.setFecModificacion(new Date());
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativo);

            }

        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }


    }

    public void inicializarBusquedaAntigua() {

        bkCotizacion.setListaCotizacionesActivos(null);
        bkCotizacion.setListaArticulosFormularioAnt(null);
        bkCotizacion.setCotizacionAntigua(new Cotizacion());
        bkCotizacion.getCotizacionAntigua().setIdArticulo(new Articulo());
        bkCotizacion.setIdCotizacionAntigua(null);
        bkCotizacion.setCategoriaArticulo(null);
        bkCotizacion.setIdArticuloAnt(new Articulo(0));

    }
    
    public void buscarArticuloAnt() {
        try {

            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkCotizacion.getCategoriaArticulo());
            //this.bkCotizacion.setListaArticulosFormulario(servicioArticulo.listarArticulosPorCategoria(articulo));
            this.bkCotizacion.setListaArticulosFormularioAnt(servicioCotizacion.listarArticulosCotizados(articulo, session.getEmpresa().getId()));
            if (this.bkCotizacion.getCategoriaArticulo().getNombre().equals("TELA") || this.bkCotizacion.getCategoriaArticulo().getIdCategoriaArticulo().getNombre().equals("TELA")) {
                this.bkCotizacion.getCotizacionFormulario().setTipoCot('T');
            } else {
                this.bkCotizacion.getCotizacionFormulario().setTipoCot('P');
            }
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void aplicarDatosAntiguos(ActionEvent actionEvent) {

        //bkCotizacion.getCotizacionAntigua().setDetallePedidoFpCollection(null);
        try {
            bkCotizacion.setCotizacionFormulario(servicioCotizacion.conseguirCotizacionPorId(bkCotizacion.getCotizacionAntigua().getId()));
            Hibernate.initialize(bkCotizacion.getCotizacionFormulario().getIdCliente());
            bkCotizacion.getCotizacionFormulario().setDetallePedidoFpCollection(null);
            if (bkCotizacion.getTipoCotAntigua() == 'N') {

                bkCotizacion.setEsNuevaVersion(true);

                /*bkCotizacion.getCotizacionFormulario().setVersion(
                 servicioCotizacion.obtenerVersionDeCotizacion(bkCotizacion.getCotizacionFormulario()));*/

                bkCotizacion.setVersion(bkCotizacion.getCotizacionFormulario().getVersion() + 1);

            } else {

                bkCotizacion.setEsNuevaVersion(false);
            }
            bkCotizacion.getCotizacionFormulario().setCambioCompra(bkCotizacion.getTipoCambio().getCompra());
            bkCotizacion.getCotizacionFormulario().setCambioVenta(bkCotizacion.getTipoCambio().getVenta());
            iniciarEdicion();
            bkCotizacion.setListaDetalleCotizacionesVersion(new ArrayList<DetalleCotizacion>());
            bkCotizacion.getListaDetalleCotizacionesVersion().addAll(bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar());
            buscarArticulo();
        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void buscarCotizacionAntigua() {
        try {
            if (bkCotizacion.getIdCotizacionAntigua() != 0) {
                this.bkCotizacion.setCotizacionAntigua(servicioCotizacion.conseguirCotizacionPorId(bkCotizacion.getIdCotizacionAntigua()));
            } else {
                bkCotizacion.setCotizacionAntigua(new Cotizacion());
            }
        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void cargarCodigos() {
        if (this.bkCotizacion.getIdArticuloAnt().getId() != 0) {
            try {
                bkCotizacion.getCotizacionAntigua().setIdArticulo(servicioArticulo.conseguirArticuloPorId(this.bkCotizacion.getIdArticuloAnt().getId()));
                bkCotizacion.getCotizacionAntigua().setIdEmpresa(session.getEmpresa());
                bkCotizacion.setListaCotizacionesActivos(servicioCotizacion.listarUltimasVersionesCotizacion(bkCotizacion.getCotizacionAntigua()));
            } catch (ServiceException e) {
                e.printStackTrace();
                logger.error(e.getMessage(), e);
                mostrarError("Ocurrio un error al cargar la informacion.");
            }
        }else{
            bkCotizacion.setListaCotizacionesActivos(null);
        }
    }

    @Override
    public String retroceder() {
        return URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Cotizacion.URL_LISTA_COTIZACION;
        //return mostrarMantenimiento();
    }

    public void handleFileUpload(FileUploadEvent event) {
        bkCotizacion.setImagen(event.getFile());
        FacesMessage msg = new FacesMessage("Se subió ", event.getFile().getFileName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    private boolean guardarLogoServer(UploadedFile fileLogo, String logo) throws ServiceException {
        try {
            File archivoLogo = new File(logo);
            if (archivoLogo != null) {
                if (archivoLogo.exists()) {
                    UtilitarioArchivos.delete(archivoLogo);
                }
            }
            System.out.println("Logo " + logo);
            System.out.println("Archivo Logo " + archivoLogo);
            System.out.println("FileLogo " + fileLogo);
            System.out.println("Flujo " + fileLogo.getInputstream());
            UtilitarioArchivos.copyInputStream(fileLogo.getInputstream(), archivoLogo);
            return true;
        } catch (IOException e) {
            throw new ServiceException(e);
        }

    }
}
